package com.internetCafes.spms.web.sys.service;

import com.internetCafes.spms.web.sys.form.SysRegisterForm;
import com.internetCafes.spms.web.sys.model.UserInfo;

import java.util.List;
import java.util.Map;


/**
 * 系统用户
 *
 * @author Sunny
 * @email rekeeper2011@hotmail.com
 * @date 2016年9月18日 上午9:43:39
 */
public interface UserInfoService {

    /**
     * 根据企业id列表查询企业下的用户信息
     *
     * @return 企业用户信息
     * @author: Zheng
     */
    List<UserInfo> queryByTenantIds(List<Long> tenantIds);

    /**
     * 查询用户的所有权限
     *
     * @param userId 用户ID
     */
    List<String> queryAllPerms(Long userId);

    /**
     * 查询用户的所有菜单ID
     */
    List<Long> queryAllMenuId(Long userId);

    /**
     * 根据用户名，查询系统用户
     */
    UserInfo queryByUserName(String username);

    /**
     * 根据用户名，查询系统用户
     */
    List<UserInfo> queryByName(String name);

    /**
     * 根据用户名，查询系统用户
     */
    UserInfo queryByTypeAndUserName(int type, String username);

    /**
     * 根据用户ID，查询用户
     *
     * @param userId
     * @return
     */
    UserInfo queryObject(Long userId);

    /**
     * 查询用户列表
     */
    List<UserInfo> queryList(Map<String, Object> map);

    /**
     * 查询总数
     */
    int queryTotal(Map<String, Object> map);

    /**
     * 保存用户
     */
    void save(UserInfo user);

    /**
     * @param registerForm SysRegisterForm类型数据，封装新增添加信息。
     *                     1、向数据库租户企业表中添加新增租户企业信息。
     *                     2、向数据库租户企业与部门表中添加租户企业的默认部门
     *                     3、根据用户选择角色id向数据库角色表查询角色表信息
     *                     4、向数据库中租户企业与角色表添加信息
     *                     5、根据角色id向数据库查找对应功能id并向租户企业与角色和菜单功能表中插入数据
     *                     6、生成员工实体类，并插入员工o表中。
     *                     7、生成User实体类，调用同类中save()方法加入用户表中
     */
    void saveTenantAndDepartmentAndUser(SysRegisterForm registerForm);

    /**
     * 修改用户
     */
    void update(UserInfo user);

    /**
     * 修改用户
     */
    void justUpdate(UserInfo user);

    /**
     * 删除用户
     */
    void deleteBatch(Long[] userIds);

    /**
     * 修改密码
     *
     * @param userId      用户ID
     * @param password    原密码
     * @param newPassword 新密码
     */
    int updatePassword(Long userId, String password, String newPassword);


    /**
     * 根据用户类型
     */
    List<UserInfo> queryByTypeAndUserId(Integer type, Long userId);

    List<UserInfo> selectByParams(Map<String, Object> params);

    UserInfo queryByNickName(String nickName);

    /**
     * 根据用户名，查询系统用户
     */
    UserInfo queryByOrgNameAndUseName(Map<String, Object> params);

    List<UserInfo> queryByOrgNameAndUseNameAndType(Map<String, Object> params);

    /**
     * 根据用户名和租户id 获取用户
     *
     * @param name     用户名称
     * @param tenantId 租户id
     * @return 用户信息
     */
    UserInfo getByTenantIdAndName(Long tenantId, String name);
}
